package utils

import (
	"time"

	"github.com/golang-jwt/jwt/v5"
)

// 自定义声明类型
type CustomClaims struct {
	UserID               uint   `json:"user_id"`  // 用户id
	Username             string `json:"username"` // 用户名称
	jwt.RegisteredClaims        // 内嵌标准的声明
}

// 密钥
var secretKey = "AllYourBase"

// 生成 JWT 字符串
func CreateJWTStr(userId uint, username string) (string, error) {
	// 创建一个自己声明的实例
	claims := CustomClaims{
		userId,   // 自定义字段-用户id
		username, // 自定义字段-用户名
		jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24)), // 过期时间
			Issuer:    "逗比",                                               // 签发人
		},
	}
	// 生成token对象
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString([]byte(secretKey))
}

// 解析 JWT 字符串
func ParseJWTStr(jwtStr string) (*jwt.Token, *CustomClaims, error) {
	var mc = new(CustomClaims)
	token, err := jwt.ParseWithClaims(jwtStr, mc, func(token *jwt.Token) (i interface{}, err error) {
		return []byte(secretKey), nil
	})
	return token, mc, err
}
